FEXP Solver  1.0.0.0
FEXPNetworkWinSocket.h
Go to the documentation of this file.
1 // © FEXP, FEXPEnterprise Solver, Ing. Vaclav Rek
3 // Windows socket communication.
4 // Compiler must support C++ ver.14 and later
6 #ifndef _CFEXPWINDOWSSOCKET_H_
7 #define _CFEXPWINDOWSSOCKET_H_
8 #include "FEXPCommon.h"
9 #include "FEXPConcurency.h"
10 #include "FEXPNetworkInterface.h"
11 
12 #define SERVER_CLIENT_DEFINITION CFEXPNetServerWinClient
13 #define SERVER_CLIENT_THREAD_DEFINITION CFEXPCppThread<void(Ptr<SERVER_CLIENT_DEFINITION>), Ptr<SERVER_CLIENT_DEFINITION>>
14 
15 // Need to link with Ws2_32.lib
16 #pragma comment(lib, "ws2_32.lib")
17 
18 // Windows OS -- setting
19 #define WININVSCK INVALID_SOCKET // invalid socket
20 #define WINSOCKET MAKEWORD(2, 2) // the highest version of Windows Sockets specification that the caller can use. The high-order byte specifies the minor version number; the low-order byte specifies the major version number.
21 #define WINPR_TCP IPPROTO_TCP // TCP communication protocol
22 //#define WINPR_DMY IPPROTO_IP // dummy for IP
23 #define WINSCTYPE SOCK_STREAM // stream socket
24 #define WINNETWRK AF_INET // internetwork protocols: UDP, TCP, etc.
25 #define WINNONADR 0 // erro for non-legitimate Internet address
26 #define WINANYADR INADDR_ANY
27 #define WINSOCSDW SD_BOTH // 0x02 -- manifest constants for shutdown()
28 
34 
37 {
38 public:
39  // [no public members ] -----------------------------
40 protected:
41  static std::map<int, const std::string> CONNECTION_ERRORS_1;
42  static std::map<int, const std::string> CONNECTION_ERRORS_2;
43  static std::map<int, const std::string> CONNECTION_ERRORS_3;
44  static std::map<int, const std::string> CONNECTION_ERRORS_4;
45  static std::map<int, const std::string> CONNECTION_ERRORS_5;
46 private:
47  // [no private members ] -----------------------------
48 };
49 
55 #define MAX_MSG_IN_LEN 0x1000 // 1 x 4096 [B]
56 #define MAX_MSG_OT_LEN 0x1000 // 1 x 4096 [B]
57 
60 {
61 public:
64  using REQUEST =
65  struct rqs_msg
66  {
67  char record[MAX_MSG_IN_LEN]; // message content
69  void set_to_default () { memset((void*)&record, FEXPCOMMON_ZERO_END_CHAR, sizeof(record)); }
70  void set_data_to_send(const std::string & data) { set_to_default(); data.copy((char*)record, MAX_MSG_IN_LEN); }
71  };
74  using RESPONSE =
75  struct rsp_msg
76  {
77  char record[MAX_MSG_OT_LEN]; // message content
79  void set_to_default() { memset((void*)&record, FEXPCOMMON_ZERO_END_CHAR, sizeof(record)); }
80  std::string get_send_data () { return CFEXPBaseConvers::StrTrim(std::string((char*)record)); }
81  };
82 
83  // for win socket communication
84  static t_ENetMessage WinSocketDataRead (SOCKET socket, CFEXPNETWinMessage::REQUEST & request, CFEXPNETWinMessage::RESPONSE & response, t_ModelData & data);
85  static void WinSocketDataWrite(SOCKET socket, CFEXPNETWinMessage::REQUEST & request, CFEXPNETWinMessage::RESPONSE & response, t_ModelData & data, t_ENetMessage message);
86 protected:
87  // for win socket communication
88  static bool win_write_to_socket (REQUEST & request , SOCKET socket, const std::string & send_data);
89  static t_ENetMessage win_read_from_Socket(RESPONSE & response, SOCKET socket, std::vector<std::string> & read_data);
90 private:
91  // [no private members ] -----------------------------
92 };
93 
99 
103 {
104 public:
105  CFEXPNetClientWinSocketConnection(size_t client_id, std::string server_ip, size_t port,
106  std::function<void(std::function<void(size_t)>, ICFEXPNetClientNodeService &)> main);
108 
109  // override pure virtual member functions
110  virtual void Run () override;
111  virtual void Close() override;
112  // override pure virtual member functions -- service
114  virtual void SendInstruction(size_t message, Ptr<t_ModelData> data) override;
115  virtual Ptr<t_ModelData> GetMacroModelData() override;
116  virtual void AddMacroModelData(const t_ModelDataKey & key, Ptr<t_ModelDataDta> data) override;
117  virtual Ptr<t_ModelDataDta> GetMacroModelData(const t_ModelDataKey & key) override;
118 protected:
119  // [no protected members] -----------------------------
120 private:
121  // main process loop
122  std::function<void(std::function<void(size_t)>, ICFEXPNetClientNodeService &)> _main_loop;
123 
124  // connection data
125  sockaddr_in _sock_server_adress;
126  SOCKET _socket;
127  void create_socket();
128  // messages for net communication
129  CFEXPNETWinMessage::REQUEST _req_message;
130  CFEXPNETWinMessage::RESPONSE _res_message;
131  // data for solver
132  // data related to macro models
133  std::atomic_bool _new_macro_model;
134  Ptr<t_ModelData> _macro_model_data_map;
135 
136  // serialized data received
137  // serialized data from fe nodes
138  std::map<std::string, t_SerializedData> _serialize_calc_data_get_map;
139  std::map<std::string, t_SerializedData> _serialize_calc_data_set_map;
140 };
141 
147 
150  : public ICFEXPNetServerClientNode<SOCKET>
151 {
152 public:
153  CFEXPNetServerWinClient(SOCKET socket, std::string & ip, size_t id, std::string & server_ip,
154  std::function<t_ENetThrdMsg (size_t, size_t )> message_gttr,
155  std::function<bool (size_t, size_t )> message_lchr,
156  std::function<void (size_t, size_t , t_ENetThrdMsg)> message_sttr,
157  std::function<Ptr<t_NetCalcData>(size_t )> clcdata_gttr,
158  std::function<void (size_t )> state_update,
159  std::function<bool (size_t )> synchronizer,
160  std::function<void (size_t, t_fexpcommon_ct )> dtmacro_sttr,
161  std::function<void (size_t, Ptr<CFEXGeomTools::t_BoundBox>, size_t )> mdmacro_sttr);
162  virtual ~CFEXPNetServerWinClient();
163 
164  // override pure virtual member functions
165  virtual void Run () override;
166  virtual void Close() override { close_connection(); }
167 protected:
168  // [no protected members] -----------------------------
169 private:
170  bool _calculation_started;
171 
172  // main client loop
173  void main_loop ();
174  // close client socket connection
175  void close_connection ();
176  // synchronization stages
177  bool run_calc_synchr_stage(size_t stage);
178  // client finishing
179  void client_finishing ();
180  // calculation communication steps
181  // load calc data from server
182  Ptr<t_NetCalcData> get_server_data(bool wait_for_server_message = true);
183  // initialize data procedure
184  void load_model_data (Ptr<t_NetCalcData> data);
185  // control of calculation end
186  bool calculation_end_control (Ptr<t_NetCalcData> data);
187  // control of process continue
188  bool process_continue_control (Ptr<t_NetCalcData> data);
189  // control of calculation stability
190  void stability_control (Ptr<t_NetCalcData> data);
191  // result for saving
192  void simulation_results (Ptr<t_NetCalcData> data);
193  // data transfer based on server anysis
194  void data_exchange_control (Ptr<t_NetCalcData> data);
195  void load_bounding_boxes (Ptr<t_NetCalcData> data);
196  void transfer_calc_data_request (Ptr<t_NetCalcData> data);
197  void transfer_calc_data_response(Ptr<t_NetCalcData> data);
198  // send data
199  CFEXPNETWinMessage::REQUEST _req_message;
200  CFEXPNETWinMessage::RESPONSE _res_message;
201 };
202 
203 #endif // !_CFEXPWINDOWSSOCKET_H_
CFEXPNetClientWinSocketConnection(size_t client_id, std::string server_ip, size_t port, std::function< void(std::function< void(size_t)>, ICFEXPNetClientNodeService &)> main)
Definition: FEXPNetworkWinSocket.cpp:364
void set_to_default()
Definition: FEXPNetworkWinSocket.h:69
static std::map< int, const std::string > CONNECTION_ERRORS_1
Definition: FEXPNetworkWinSocket.h:41
rqs_msg()
Definition: FEXPNetworkWinSocket.h:68
#define FEXPCOMMON_ZERO_END_CHAR
Definition: FEXPCommon.h:187
virtual void AddMacroModelData(const t_ModelDataKey &key, Ptr< t_ModelDataDta > data) override
Definition: FEXPNetworkWinSocket.cpp:524
Base network interface of a client node.
Definition: FEXPNetworkInterface.h:46
#define MAX_MSG_OT_LEN
Definition: FEXPNetworkWinSocket.h:56
Windows connection errors.
Definition: FEXPNetworkWinSocket.h:36
static std::map< int, const std::string > CONNECTION_ERRORS_5
Definition: FEXPNetworkWinSocket.h:45
static t_ENetMessage win_read_from_Socket(RESPONSE &response, SOCKET socket, std::vector< std::string > &read_data)
Definition: FEXPNetworkWinSocket.cpp:43
static std::string & StrTrim(std::string &str)
Definition: FEXPCommon.cpp:119
virtual Ptr< std::map< size_t, Ptr< t_ModelData > > > ReadInstruction() override
Definition: FEXPNetworkWinSocket.cpp:480
std::string get_send_data()
Definition: FEXPNetworkWinSocket.h:80
Definition: FEXPCommon.h:276
static t_ENetMessage WinSocketDataRead(SOCKET socket, CFEXPNETWinMessage::REQUEST &request, CFEXPNETWinMessage::RESPONSE &response, t_ModelData &data)
Definition: FEXPNetworkWinSocket.cpp:186
double t_fexpcommon_ct
Definition: FEXPCommon.h:120
void set_data_to_send(const std::string &data)
Definition: FEXPNetworkWinSocket.h:70
virtual ~CFEXPNetServerWinClient()
Definition: FEXPNetworkWinSocket.cpp:563
Connection client based on Windows socket. It is placed on the side of server.
Definition: FEXPNetworkWinSocket.h:149
CFEXPNetServerWinClient(SOCKET socket, std::string &ip, size_t id, std::string &server_ip, std::function< t_ENetThrdMsg(size_t, size_t)> message_gttr, std::function< bool(size_t, size_t)> message_lchr, std::function< void(size_t, size_t, t_ENetThrdMsg)> message_sttr, std::function< Ptr< t_NetCalcData >(size_t)> clcdata_gttr, std::function< void(size_t)> state_update, std::function< bool(size_t)> synchronizer, std::function< void(size_t, t_fexpcommon_ct)> dtmacro_sttr, std::function< void(size_t, Ptr< CFEXGeomTools::t_BoundBox >, size_t)> mdmacro_sttr)
Definition: FEXPNetworkWinSocket.cpp:548
ENETServerThreadMesage
Communication messages within the FEXP server.
Definition: FEXPNetworkInterface.h:155
virtual void Close() override
Definition: FEXPNetworkWinSocket.h:166
virtual void SendInstruction(size_t message, Ptr< t_ModelData > data) override
Definition: FEXPNetworkWinSocket.cpp:502
static std::map< int, const std::string > CONNECTION_ERRORS_2
Definition: FEXPNetworkWinSocket.h:42
static void WinSocketDataWrite(SOCKET socket, CFEXPNETWinMessage::REQUEST &request, CFEXPNETWinMessage::RESPONSE &response, t_ModelData &data, t_ENetMessage message)
Definition: FEXPNetworkWinSocket.cpp:314
std::map< t_ModelDataKey, Ptr< t_ModelDataDta > > t_ModelData
Definition: FEXPDataContainer.h:15
virtual ~CFEXPNetClientWinSocketConnection()
Definition: FEXPNetworkWinSocket.cpp:372
EMainNETCommunicationPoint
Items of communication protocol.
Definition: FEXPNetworkInterface.h:95
Connection client based on Windows socket. It is placed on the side of individual workstations within...
Definition: FEXPNetworkWinSocket.h:101
virtual void Run() override
Definition: FEXPNetworkWinSocket.cpp:449
#define MAX_MSG_IN_LEN
Definition: FEXPNetworkWinSocket.h:55
virtual void Run() override
Definition: FEXPNetworkWinSocket.cpp:579
virtual Ptr< t_ModelData > GetMacroModelData() override
Definition: FEXPNetworkWinSocket.cpp:517
static std::map< int, const std::string > CONNECTION_ERRORS_3
Definition: FEXPNetworkWinSocket.h:43
static std::map< int, const std::string > CONNECTION_ERRORS_4
Definition: FEXPNetworkWinSocket.h:44
rsp_msg()
Definition: FEXPNetworkWinSocket.h:78
struct rsp_msg { char record[MAX_MSG_OT_LEN] RESPONSE
Content of response message.
Definition: FEXPNetworkWinSocket.h:77
Network service on the client workstation side.
Definition: FEXPNetworkInterface.h:184
static bool win_write_to_socket(REQUEST &request, SOCKET socket, const std::string &send_data)
Definition: FEXPNetworkWinSocket.cpp:12
Base interface for server clients.
Definition: FEXPNetworkInterface.h:250
std::string t_ModelDataKey
Definition: FEXPDataContainer.h:13
auto __cdecl main(int argv, char *argc[]) -> int
Main function (single workstation).
Definition: fexp_main.cpp:13
Communication message.
Definition: FEXPNetworkWinSocket.h:59
virtual void Close() override
Definition: FEXPNetworkWinSocket.cpp:428
struct rqs_msg { char record[MAX_MSG_IN_LEN] REQUEST
Content of request message.
Definition: FEXPNetworkWinSocket.h:67